using System;
using System.Collections.Generic;

namespace JGSY.CMS.LowCode.Platform.Application.DTOs
{
    /// <summary>
    /// 双因子认证数据传输对象
    /// 用于传输用户的双因子认证配置和状态信息
    /// </summary>
    public class TwoFactorDataDto
    {
        /// <summary>
        /// 认证密钥
        /// 用于生成双因子认证令牌的密钥
        /// </summary>
        public string Secret { get; set; } = string.Empty;
        
        /// <summary>
        /// 备份码列表
        /// 用于应急登录的一次性备份验证码
        /// </summary>
        public List<string> BackupCodes { get; set; } = new();
        
        /// <summary>
        /// 是否启用
        /// 标识双因子认证是否已启用
        /// </summary>
        public bool Enabled { get; set; }
        
        /// <summary>
        /// 最后使用时间
        /// 双因子认证最后一次使用的时间戳
        /// </summary>
        public DateTime? LastUsed { get; set; }
    }

    /// <summary>
    /// 双因子认证设置结果数据传输对象
    /// 用于传输双因子认证初始化设置的结果信息
    /// </summary>
    public class TwoFactorSetupResultDto
    {
        /// <summary>
        /// 认证密钥
        /// 用户需要添加到认证器应用的密钥
        /// </summary>
        public string Secret { get; set; } = string.Empty;
        
        /// <summary>
        /// 二维码URL
        /// 可扫描的二维码图片链接，便于用户设置
        /// </summary>
        public string QrCodeUrl { get; set; } = string.Empty;
        
        /// <summary>
        /// 手动输入密钥
        /// 用户可手动输入到认证器应用的格式化密钥
        /// </summary>
        public string ManualEntryKey { get; set; } = string.Empty;
        
        /// <summary>
        /// 备份码列表
        /// 生成的备份验证码列表，用于应急访问
        /// </summary>
        public List<string> BackupCodes { get; set; } = new();
    }

    /// <summary>
    /// 双因子认证验证结果数据传输对象
    /// 用于传输备份码验证的结果信息
    /// </summary>
    public class TwoFactorVerifyResultDto
    {
        /// <summary>
        /// 验证是否有效
        /// 标识提供的备份码是否验证成功
        /// </summary>
        public bool IsValid { get; set; }
        
        /// <summary>
        /// 剩余备份码
        /// 验证成功后剩余可用的备份码列表
        /// </summary>
        public List<string> RemainingCodes { get; set; } = new();
    }

    /// <summary>
    /// 双因子认证摘要数据传输对象
    /// 用于传输双因子认证状态的概览信息
    /// </summary>
    public class TwoFactorSummaryDto
    {
        /// <summary>
        /// 是否启用
        /// 双因子认证是否已启用的状态
        /// </summary>
        public bool Enabled { get; set; }
        
        /// <summary>
        /// 备份码数量
        /// 当前可用的备份码数量
        /// </summary>
        public int BackupCodesCount { get; set; }
        
        /// <summary>
        /// 最后使用时间
        /// 双因子认证最后使用的时间描述
        /// </summary>
        public string? LastUsed { get; set; }
        
        /// <summary>
        /// 下一个令牌生成倒计时
        /// 下一个认证令牌生成的剩余秒数
        /// </summary>
        public int NextTokenIn { get; set; }
    }
}
